; boot.asm - 简单16位bootloader示例

org 0x7c00           ; 加载到内存0x7c00处
bits 16              ; 使用16位实模式

start:
    ; 初始化寄存器
    xor ax, ax
    mov ds, ax
    mov es, ax
    mov ss, ax
    mov sp, 0x7c00    ; 设置栈顶

    ; 禁用中断
    cli

    ; 显示启动信息
    mov si, msg_boot
    call print_str

    ; 加载内核到内存0x10000处
    mov bx, 0x1000    ; ES:BX = 0x1000:0
    mov al, 10       ; 读取10个扇区
    mov ch, 0        ; 柱面0
    mov cl, 2        ; 起始扇区2
    mov dh, 0        ; 磁头0
    mov dl, 0x80     ; 驱动器0x80（第一个硬盘）
    call disk_read

    ; 检查读取是否成功
    jc disk_error

    ; 跳转到内核入口
    mov ax, 0x1000
    mov ds, ax
    mov es, ax
    mov ss, ax
    mov sp, 0x9000   ; 设置新栈顶
    sti              ; 重新启用中断
    jmp 0x1000:start_kernel ; 远跳转

disk_error:
    mov si, msg_error
    call print_str
    hlt              ; 停机

print_str:
    lodsb            ; 取字符
    or al, al
    jz .done
    mov ah, 0x0e     ; BIOS teletype服务
    mov bx, 0x0007   ; 颜色属性
    int 0x10
    jmp print_str
.done:
    ret

disk_read:
    push dx          ; 保存DL寄存器
    mov ah, 0x02     ; 读取扇区功能
    int 0x13         ; 调用BIOS磁盘服务
    jc .error        ; 检查错误
    pop dx
    cmp dh, dl       ; 检查磁头是否匹配
    jne .error
    ret
.error:
    pop dx
    stc              ; 设置进位标志表示错误
    ret

msg_boot db 'Booting...', 0
msg_error db 'Disk error!', 0

times 510-($-$$) db 0   ; 填充到510字节
dw 0xaa55               ; 有效MBR标志